#pragma once
#ifndef _MAIN_WINDOW_H_
#define _MAIN_WINDOW_H_
#ifdef WIN32  
#pragma execution_character_set("utf-8")  
#endif

#include <QMainWindow>
#include <QTimer>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QDateTime>
#include <QDebug>
#include <QLabel>
#include "ui_MainWindow.h"
#include "config.h"



//消息类型
enum MSG_TYPE {

    OK = 0,

    ERROR = 1

};

/**
 * 主窗口类
 */
class MainWindow : public QMainWindow {

    Q_OBJECT

public:

	MainWindow(QWidget *parent = Q_NULLPTR);

	~MainWindow();

    /**
     * 初始化程序
     */
    void init();

private:

    /**
     * 刷新串口列表
     */
    void refreshComList();

    /**
     * @brief 初始化指令列表
     * 
     */
    void initDirectList();

    /**
     * 打开串口
     */
    void openSerialPort();

    /**
     * 设置串口属性
     * @param baudRate 波特率
     * @param dataBits 数据位
     * @param parity 校验位
     * @param stopBits 停止位
     * @param flowControl 流控
     */
    void setPortProperty(int baudRate, int dataBits, int parity, int stopBits, int flowControl);

    /**
     * 关闭串口
     */
    void closeSerialPort();

    /**
     * 向data中加入校验码
     */
    void fillCheckcode(QByteArray& data);

    /**
     * 显示消息
     * @param label 消息显示组件
     * @param msg 消息内容
     * @param type 消息类型
     */
    void showMsg(QLabel* label, const QString& msg, int type);

    /**
     * 点击发送按钮/定时发送数据的处理函数
     */
    bool sendData();

    /**
    * 发送指定的数据
    */
    void sendData(QByteArray &data);


private slots:

    //定时器处理函数
    void onTimerHandle();

    //接受数据
    void onDataReceive();

    //打开按钮事件
    void on_openBtn_clicked();

    //清空接收框按钮
    void on_clearReceiveBtn_clicked();

    //刷新串口列表
    void on_refreshComListBtn_clicked();

    //添加指令
    void on_addDirectiveBtn_clicked();

    //删除指令
    void on_deleteDirectiveBtn_clicked();

    //定时发送开关
    void on_timerSendBox_checkStateChanged(const Qt::CheckState& state);

    //发送按钮事件
    void on_sendDataBtn_clicked();

    //表格行被点击时触发
    void on_tableWidget_cellDoubleClicked(int row, int column);

private:

    Ui_MainWindow m_ui;

    QSerialPort m_com;	    //串口类

    QTimer m_timer;         //定时发送数据的定时器

    Config& m_config;       //配置文件

};

#endif

